#ifndef BACKENDSERVICE_H
#define BACKENDSERVICE_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QStringList>
#include <QStandardPaths>
#include <QDir>
#include <QSettings>
#include "database/database_manager.h"

class DatabaseManager;
class QQmlApplicationEngine;
class QQuickWindow;
class CommandExecutor;

class BackendService : public QObject
{
    Q_OBJECT

public:
    explicit BackendService(QObject *parent = nullptr);
    ~BackendService();

    // loginCheckin 已迁移到 CommandExecutor::executeLoginCheckin
    
    // 读取自动登录状态
    Q_INVOKABLE bool loadAutoLogin();
    
    // 保存自动登录状态
    Q_INVOKABLE void saveAutoLogin(bool autoLogin);
    
    // 选择并上传文件接口
    Q_INVOKABLE void selectAndAddFile(const QString &folderId);
    
    // 处理文件覆盖确认结果
    Q_INVOKABLE void handleFileOverwriteConfirm(bool overwrite, const QString &sourceFilePath, const QString &targetFilePath, const QString &folderId);
    
    // 打开文件接口
    Q_INVOKABLE void openFile(const QString &filePath);
    // 获取用户工作目录(work)的本地绝对路径: Home/.myapps/{username}/work
    Q_INVOKABLE QString getUserWorkBaseDir() const;
    
    // 获取domains信息
    Q_INVOKABLE QVariantList getDomains();
    
    // 获取访问令牌
    Q_INVOKABLE QString getAccessToken();
    
    // 设置访问令牌（供 ExchangeAccessTokenCommand 使用）
    void setAccessToken(const QString &accessToken);
    
    // 判断是否已登录（根据 accessToken 是否存在）
    Q_INVOKABLE bool isLoggedIn() const;
    
    // 设置数据库管理器
    void setDatabaseManager(DatabaseManager *databaseManager);
    
    // 获取数据库管理器
    DatabaseManager* getDatabaseManager() const;
    
    // 设置 CommandExecutor 实例
    void setCommandExecutor(CommandExecutor *commandExecutor);
    
    // 获取 CommandExecutor 实例
    CommandExecutor* getCommandExecutor() const;
    
    // 设置 QML 引擎
    void setQmlEngine(QQmlApplicationEngine *engine);
    
    // 获取或创建窗口（单例模式）
    QQuickWindow* getOrCreateWindow(const QString &windowTitle);
    
    // 保存和加载选中的公司
    Q_INVOKABLE void saveSelectedCompany(const QString &companyId, const QString &companyName);
    Q_INVOKABLE QStringList loadSelectedCompany();
    Q_INVOKABLE void saveSelectedDiskId(const QString &diskId);
    Q_INVOKABLE QString loadSelectedDiskId();
    Q_INVOKABLE QString loadSelectedCompanyId();
    
    // 服务器地址相关接口
    Q_INVOKABLE bool testServerHost(const QString &serverHost);
    Q_INVOKABLE void saveServerHost(const QString &serverHost);
    Q_INVOKABLE QString loadServerHost();
    
    // 退出登录接口
    Q_INVOKABLE void logout();
    
    // 保存domains信息（供 LoginCheckinCommand 使用）
    void saveDomains(const QJsonArray &domains);
    
    // 加载domains信息（供自动登录使用）
    QJsonArray loadDomains();
    
    // 设置默认公司（供自动登录使用）
    void setDefaultCompany();
    
    // 尝试自动登录（应用启动时调用）
    void tryAutoLogin();

signals:
    // loginResult 和 userWorkDirectoryCreated 信号已迁移到 CommandExecutor
    
    // 文件打开完成信号
    void openFileCompleted(int resultCode, const QString &message);
    
    // exchangeAccessTokenCompleted 信号已迁移到 CommandExecutor

    void networkError(int errorCode, const QString &errorString);
    
    // 文件覆盖确认信号
    void askFileOverwrite(const QString &sourceFilePath, const QString &targetFilePath, const QString &fileName);

    // 注意：fileDownloadedForUrl信号已废弃（URL字段已移除），不再使用

private:
    QNetworkAccessManager *m_networkManager;
    QString m_baseUrl;
    QString m_currentUsername; // 当前登录用户名
    QString m_checkInToken; // 登录令牌
    QJsonArray m_domains; // 域名信息
    DatabaseManager *m_databaseManager; // 数据库管理器
    QQmlApplicationEngine *m_qmlEngine; // QML 引擎
    CommandExecutor *m_commandExecutor; // 命令执行器
    QQuickWindow *m_currentWindow; // 当前窗口引用
    QString m_currentPage; // 记录当前显示的页面："Login" 或 "Main"
    bool m_isFirstWindow; // 是否是第一个窗口（用于首次启动时最小化）
    
    // 用于跟踪获取accessToken后需要执行的操作
    QString m_pendingSyncDiskId; // 待同步的网盘ID
    QString m_pendingSyncFolderId; // 待同步的文件夹ID
    QString m_pendingCommitSourceFileId; // 待提交的源文件ID（已迁移到 CommitFileCommand，保留用于向后兼容）
    
    // loginCheckin 相关方法已迁移到 LoginCheckinCommand
    // handleLoginResponse、parseLoginResponse 和 createUserWorkDirectory 已迁移到 LoginCheckinCommand
    
    
    
    
    
    
    
    
    // exchangeAccessToken 相关方法已迁移到 ExchangeAccessTokenCommand
    // handleExchangeAccessTokenResponse 和 parseExchangeAccessTokenResponse 已移除
    
    // Token相关方法
    void saveToken(const QString &checkInToken);
    QString loadCheckInToken();
    void clearToken();
    void addTokenToRequest(QNetworkRequest &request);
    
    // Domains相关方法
    void clearDomains();
    
    // 选中公司ID和网盘ID的保存和加载
    void saveSelectedCompanyId(const QString &companyId);
    
    // 通知相关私有方法
    void handleGetNoticeResponse(QNetworkReply *reply);
    void parseGetNoticeResponse(const QJsonObject &response);
    void handleNetworkError(QNetworkReply *reply);
    QNetworkRequest createRequest(const QString &url, const QString &method = "GET");
    QString buildQueryParams(int readStatus, int type, int currpage, int rowcount);
    
    // 从 rootObjects 中查找匹配的窗口
    QQuickWindow* findWindowByPageName(const QString &pageName);
};

#endif // BACKENDSERVICE_H
